/**
 * @author: dn-jinmin/dn-jinmin
 * @doc:
 */

package websocket

import "time"

// FrameType 定义了消息帧的类型
type FrameType uint8

const (
	FrameData  FrameType = 0x0 // 数据帧
	FramePing  FrameType = 0x1 // Ping帧
	FrameAck   FrameType = 0x2 // 确认帧
	FrameNoAck FrameType = 0x3 // 无需确认帧
	FrameErr   FrameType = 0x9 // 错误帧

	//FrameHeaders      FrameType = 0x1
	//FramePriority     FrameType = 0x2
	//FrameRSTStream    FrameType = 0x3
	//FrameSettings     FrameType = 0x4
	//FramePushPromise  FrameType = 0x5
	//FrameGoAway       FrameType = 0x7
	//FrameWindowUpdate FrameType = 0x8
	//FrameContinuation FrameType = 0x9
)

// Message 结构体定义了WebSocket消息的格式
// 包含消息类型、唯一标识符、确认序列号、确认时间、错误计数、方法名、表单标识符和数据等信息
type Message struct {
	FrameType `json:"frameType"` // 消息帧类型
	Id        string             `json:"id"`       // 消息唯一标识符
	AckSeq    int                `json:"ackSeq"`   // 确认序列号
	ackTime   time.Time          `json:"ackTime"`  // 确认时间
	errCount  int                `json:"errCount"` // 错误计数
	Method    string             `json:"method"`   // 方法名
	FormId    string             `json:"formId"`   // 表单标识符
	Data      interface{}        `json:"data"`     // 消息携带的数据，具体内容由消息类型决定
}

// NewMessage 创建一个新的Message实例
// 参数:
//
//	formId - 与消息关联的表单标识符
//	data - 消息携带的数据
//
// 返回:
//
//	*Message - 新创建的消息实例
func NewMessage(formId string, data interface{}) *Message {
	return &Message{
		FrameType: FrameData,
		FormId:    formId,
		Data:      data,
	}
}

// NewErrMessage 创建一个新的错误消息实例
// 参数:
//
//	err - 错误对象
//
// 返回:
//
//	*Message - 新创建的错误消息实例
func NewErrMessage(err error) *Message {
	return &Message{
		FrameType: FrameErr,
		Data:      err.Error(),
	}
}
